﻿
using System;
using System.Collections.Generic;
using System.Text;

namespace JESAI.Redis.Enums
{
    /// <summary>
    /// Redis协议版本
    /// </summary>
    public enum RedisProtocolEnum
    {
        /// <summary>
        /// 该协议支持以下数据类型：简单字符串，错误类型，整数，批量字符串和数组。
        /// </summary>
        RESP, //Redis1.2版本引入
        /// <summary>
        /// RESP 协议使用 \r\n 作为分隔符     
        /// </summary>
        /// <remarks>
        ///  1. 整数
        ///  以 : 作为开头，格式为: :[<+|->]<value>\r\n
        /// :1234\r\n 用来表示整数 1234
        /// :-567\r\n 用来表示整数 -567
        /// 
        /// 2.简单字符串
        /// 以 + 作为开头，格式为: +Simple String\r\n
        /// 比如返回简单字符串 "OK"，使用 RESP2 表示即为:
        /// +OK\r\n
        /// 
        /// 3.复杂字符串(Bulk strings)
        ///   以 $ 作为开头，格式为: $<length>\r\n<content>\r\n
        ///  比如返回一个字符串 "Hello World"，使用 RESP2 表示即为:
        /// $11\r\nHello World\r\n
        /// 
        /// 4.错误类型
        /// 以 - 作为开头，格式为: -Error message\r\n
        ///  比如返回一个错误类型 "ERR invalid password"，使用 RESP2 表示即为:
        /// -ERR invalid password\r\n
        /// 
        /// 5.数组
        /// 以 * 作为开头，格式为: *<count>\r\n<item1>\r\n<item2>\r\n...<itemN>\r\n
        ///  比如返回一个数组，其中包含两个字符串 "Hello" 和 "World"，使用 RESP2 表示即为:
        ///   *2\r\n$5\r\nHello\r\n$5\r\nWorld\r\n
        ///   
        /// 6.空(null)
        /// 以 $-1 作为开头，格式为: $-1\r\n
        ///  比如返回一个空值，使用 RESP2 表示即为:
        /// $-1\r\n
        /// </remarks>
        RESP2, //Redis2.0版本引入

        /// <summary>
        /// RESP3 协议使用 \n 作为分隔符     
        /// </summary>
        /// <remarks>
        /// 增加以下类型
        /// 1. 布尔类型
        /// 以 #t 或者 #f 作为开头，格式为: #t\n or #f\n
        ///  比如返回布尔类型 true，使用 RESP3 表示即为:
        /// #t\n
        /// 
        /// 2. 空(null)
        /// 以 _ 开头，格式固定为: _\r\n
        /// 
        /// 3. 浮点数
        /// 以 $ 作为开头，格式为: $<length>\r\n<content>\r\n
        ///  比如返回一个浮点数 3.14，使用 RESP3 表示即为:
        /// $4\r\n3.14\r\n
        ///
        /// 4.大数类型(Big Numbers)
        /// 以 $ 作为开头，格式为: $<length>\r\n<content>\r\n
        ///  比如返回一个大数类型，使用 RESP3 表示即为:
        ///  例如大数 3492890328409238509324850943850943825024385 在 RESP3 里面表示即为:
        /// (3492890328409238509324850943850943825024385\r\n
        /// 
        /// 5. 复杂错误类型(Bulk errors)
        /// 以 ! 作为开头，格式为: !<length>\r\n<content>\r\n
        ///  比如返回一个复杂错误类型，使用 RESP3 表示即为:
        /// !11\r\nERR invalid password\r\n
        ///
        /// 6.字典(Maps)
        ///   以 % 作为开头，格式为: %<count>\r\n<key1><value1>\r\n<key2><value2>\r\n...<keyN><valueN>\r\n
        ///  比如返回一个字典，其中包含两个键值对 "name" 和 "age"，使用 RESP3 表示即为:
        ///   %2\r\nname\r\nJohn\r\nage\r\n30\r\n
        ///   
        ///  7.集合(Sets)
        ///   以 & 作为开头，格式为: &<count>\r\n<item1>\r\n<item2>\r\n...<itemN>\r\n
        ///  比如返回一个集合，其中包含两个字符串 "Hello" 和 "World"，使用 RESP3 表示即为:
        ///   &2\r\n$5\r\nHello\r\n$5\r\nWorld\r\n
        ///   
        ///  8.推送(Push)
        ///   以 > 作为开头，格式为: ><count>\r\n<item1>\r\n<item2>\r\n...<itemN>\r\n
        ///    比如返回一个推送，其中包含两个字符串 "Hello" 和 "World"，使用 RESP3 表示即为:
        ///     >2\r\n$5\r\nHello\r\n$5\r\nWorld\r\n
        ///     
        ///  9.Verbatim strings
        ///   以 = 作为开头，格式为: =<length>\r\n<content>\r\n
        ///    比如返回一个Verbatim字符串，使用 RESP3 表示即为:
        ///     =11\r\nHello World\r\n
        /// </remarks>
        RESP3  //Redis6.0版本引入
    }
}
